/*
这个函数的设计思路是将输入的任意进制数字字符串转换为十进制的字符串表示。
首先，通过分割输入字符串来提取数字和其原始进制，验证格式和进制范围。
接着，将提取的数字从原始进制转换为十进制，
最后再将十进制数转换为指定的目标进制，
期间通过字符映射将数字转换为对应的字符，并处理特殊情况，如输入为0或目标进制为10。
整个过程中，利用字符串处理和数学运算来确保转换的正确性和效率。
 */

pub fn convert_base(num_str: &str, to_base: u32) -> String {
    // TODO: 这里写逻辑
    // todo!()

    // 提取数字部分和进制部分
    // 数字部分位于 '(' 之前，进制部分位于 '(' 之后
    let parts: Vec<&str> = num_str.split('(').collect();
    // 检查输入格式是否正确（应当有两个部分：数字和进制）
    if parts.len() != 2 {
        panic!("Invalid input format");
    }
    // 获取数字部分，并移除尾部的 ')'
    let num_part = parts[0].trim_end_matches(')');
    // 获取进制部分，并移除尾部的 ')'
    let from_base_str = parts[1].trim_end_matches(')');
    // 将进制部分从字符串转换为 u32
    let from_base = from_base_str.parse::<u32>().expect("Invalid base");

    // 检查进制是否在支持的范围内（2-16）
    if from_base < 2 || from_base > 16 || to_base < 2 || to_base > 16 {
        panic!("Base out of range");
    }

    // 将数字从原始进制转换为10进制
    let num_in_decimal = num_part.chars().fold(0u32, |acc, c| {
        // 将字符转换为对应的数字，并累加到总和中
        acc * from_base + c.to_digit(from_base).expect("Invalid number")
    });

    // 如果目标进制是10，直接返回10进制数字的字符串形式
    if to_base == 10 {
        return num_in_decimal.to_string();
    }

    // 将10进制数字转换为目标进制
    let mut result = String::new();
    let mut num = num_in_decimal;

    // 循环直到数字被完全转换
    while num > 0 {
        // 计算当前最低位的数字
        let digit = num % to_base;
        // 将数字转换为字符并添加到结果字符串的前面
        result.push(if digit < 10 {
            // 数字0-9直接转换为对应的字符
            (b'0' + digit as u8) as char
        } else {
            // 数字10-15转换为对应的字母A-F
            (b'a' + (digit - 10) as u8) as char
        });
        // 更新数字，移除已经处理的最低位
        num /= to_base;
    }

    // 如果结果为空，说明原始数字为0
    if result.is_empty() {
        result.push('0');
    }

    // 反转字符串，因为我们是按从低位到高位的顺序添加字符的
    result.chars().rev().collect()
}
